/*
 * Copyright (C) 2010 Graham Allan
 * 
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 * 
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 * 
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */

package edu.strath.cis.grallan.findbugs.adaptiveranking.population;

import edu.umd.cs.findbugs.BugInstance;
import edu.umd.cs.findbugs.MethodAnnotation;

/**
 * @author Graham Allan (grallan@cis.strath.ac.uk)
 */
public class MethodPopulationMap extends AbstractAlertPopulationMap {

	public MethodPopulationMap(PopulationType populationType) {
		super(populationType);
	}

	@Override
	protected MethodPopulation newPopulationFor(BugInstance alert) {
		MethodAnnotation primaryMethod = alert.getPrimaryMethod();
		MethodPopulation population = primaryMethod == null ? MethodPopulation.NULL_METHOD_POPULATION
				: MethodPopulation.populationOf(primaryMethod);
		return population;
	}

	private class MethodPopulationKey extends PopulationKey {
		private final MethodAnnotation method;

		public MethodPopulationKey(MethodAnnotation method) {
			this.method = method;
		}

		@Override
		public int hashCode() {
			return method.hashCode();
		}

		@Override
		public boolean equals(Object obj) {
			if (obj == null || this.getClass() != obj.getClass())
				return false;
			MethodPopulationKey key = (MethodPopulationKey) obj;
			return method.equals(key.method);
		}
	}

	@Override
	protected PopulationKey getKeyFor(BugInstance alert) {
		MethodAnnotation method = alert.getPrimaryMethod() == null ? NULL_METHOD_KEY : alert.getPrimaryMethod();
		return new MethodPopulationKey(method);
	}

	private static final MethodAnnotation NULL_METHOD_KEY = new MethodAnnotation("NullMethodAnnotation",
			"NullMethodAnnotation", "()V", false);

}
